package com.future;

import java.util.HashSet;
import java.util.Set;

/**
 * Description:
 * 编写一个算法来判断一个数 n 是不是快乐数。
 * 「快乐数」定义为：
 * 对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
 * 然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
 * 如果 可以变为1，那么这个数就是快乐数。
 * 如果 n 是快乐数就返回 true ；不是，则返回 false 。
 * 示例 1：
 * 输入：19
 * 输出：true
 * 解释：
 * 1^2 + 9^2 = 82
 * 8^2 + 2^2 = 68
 * 6^2 + 8^2 = 100
 * 1^2 + 0^2 + 0^2 = 1
 * 示例 2：
 * 输入：n = 2
 * 输出：false
 * 提示：
 * 1 <= n <= 2^31 - 1
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/happy-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/11/4 15:12
 */
public class Solution_isHappy_202 {

    public static void main(String[] args) {

        int[] arr = {19,2};
        for (int s: arr) {
            System.out.println(isHappy(s));
        }
    }

    /**
     * 2
     * 2^2 = 4
     * 4^2 = 16
     * 1+36 = 37
     * 9+49=58
     * 25+64=89
     * 64+81=145
     * 1+16+25=42
     * 16+4=20
     * 4+0=4（***）
     * 出现循环了
     *
     * @param n
     * @return
     */
    public static boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>(); // 记录是否出现循环
        int res = n;
        while (res != 1) {
            if (!set.add(res)){
                // 出现循环就退出
                return false;
            }
            res = process(res);
        }
        return true;
    }

    private static int process(int n) {
        int res = 0;
        int tmp = 0;
        while (n != 0) {
            tmp = n % 10;
            res += tmp * tmp;
            n = n / 10;
        }
        return res;
    }
}
